// 奶牛坐电梯 状压dp 分组问题 深搜版
// https://www.luogu.com.cn/problem/P3052
int n, m, all;
int a[maxn];
int sum[1 << maxn]; // 状态为 s 时，物品的体积总和
int f[1 << maxn];   // 状态为 s 时，最小分组数量

int dfs(int msk) {
    if (f[msk] != -1) return f[msk];
    if (msk == 0) return f[msk] = 0;

    int ans = inf;
    for (int to = msk; to > 0; to = (to - 1) & msk) {
        if (check(to)) continue; // 检测体积之和是否能在一组
        ans = min(ans, f(msk ^ to) + 1);
    }
    return f[msk] = ans;
}